# Changelog

## 1.9.3 (2026-11-12)

### Added
- Windows installer: choose **Just for me** (your own profile, no administrator rights, as before) or **Everyone on this computer** (Program Files and a Start menu entry for every user; Windows asks for administrator rights). An update keeps the choice made last time; `/ALLUSERS` and `/CURRENTUSER` choose on the command line (with `/S` for a silent install). Removing an install made for everyone also asks for administrator rights.

### Fixed
- Session Manager: session names line up on the left instead of being centred in the list.

## 1.9.2 (2026-11-11)

Fixes from a review of the whole program.

### Security
- Scripting on Windows: the script API's password (token) was always the same (all zeros), so any program on the computer could type into your sessions or read the clipboard through it. It is now random, and scripting does not start without a random source.
- BBS Directory and SyncTERM import: a BBS from a list was given the default session's logins, so an RLogin credential, an SSH key, agent forwarding or an expect/send password set there could be sent to someone else's BBS. These are now left out.
- Updates: a download is refused unless it is https (also after redirects) and the release gives its full SHA-256 checksum.
- SFTP downloads on Windows: a server could name a file `C:something` and have it written outside the download folder.
- A host could switch to the alternate screen, set the window title or ask for the cursor position past the session's settings by doubling the escape character (`ESC ESC [`).

### Fixed
- Crashes and freezes: narrowing the window (or a host switching to 80 columns) through a wide character, then writing in the last column; a host sending `ESC[65535@`; a non-ASCII colour such as `#1é234`; uploading a file dated before 1970.
- SSH Agent > Add Key with a wrong passphrase hung the whole program; it now says the passphrase is wrong.
- SSH port forwards: a program that stopped reading from a forward froze the session and every other forward; a program that half-closes its connection (as HTTP clients and `nc -N` do) now gets the reply; agent Remove always removes the key you chose.
- Settings: if settings.json or bbs-directory.json could not be read, the next save replaced it with defaults. An unreadable file is now never overwritten, and a damaged BBS directory is kept as a `.bad-` copy first.
- Sync: when the same session was made on two computers, the second one lost its own local settings for it (key file, shell, log folder); a failed retry no longer leaves the settings half changed.
- SFTP: uploads to servers without OpenSSH's fsync extension always failed; a read-only file could not be uploaded again; replacing a file on an older server now moves the old one aside instead of deleting it first; folder copies no longer follow links to folders (a link loop filled the disk), and Cancel works between folders.
- Zmodem: files over 4 GiB; a ZFILE resent without its file information; a confused receiver (ZACK, ZNAK) could stall or break an upload; a repeated file header left a stray `.part` file.
- Kermit: long file names no longer need packets the receiver did not agree to.
- Telnet: a server could make the subnegotiation buffer grow without limit.
- Terminal: leaving a full-screen program (such as `less` or `vim`) threw a scrolled-back view to the top of the history; VPA moved the cursor right in origin mode with margins; a sixel image could show an earlier picture after a reset; SCO ANSI colours `38;5;n` were read as font switches; automatic reconnect never stopped for a server that closes at once.
- Copy Public Key: closing the window during the login left the connection open; a commented-out copy of the key counted as already installed.
- RLogin sends the current window size; on Windows, closing a serial session frees the COM port at once.
- A multi-line paste confirmed after switching tabs went into the wrong tab; closing a split pane could leave the active tab off screen; editing several sessions at once no longer changes their custom ports or clears their button bars; importing a SyncTERM list never overwrites an existing credential's password.
- Scripting: recorded Lua scripts could send the wrong bytes after a control character; relative script paths work; Python `app.Screen` keeps its read position; Lua `write_file` keeps the file's permissions and writes through links.
- RDP: Shift+Insert and a held Ctrl+Alt+End could leave keys held down on the remote desktop; copied text with Windows line ends got a blank line between lines.
- Log file names are made safe for Windows (`:` and the other characters it refuses).

### Changed
- Sync no longer makes the window wait while the sync folder (perhaps a network drive) is read and written; it runs in the background.
- Small speed-ups in terminal output and drawing.

## 1.9.1 (2026-11-11)

### Fixed
- BBS Directory: **Save as session** put the BBS at the top of the Session Manager, above the Sessions folder. It now goes in the Sessions folder, like a session made with New Session. A session saved by 1.9.0 can be moved with right-click > Properties… > Folder.

## 1.9.0 (2026-11-11)

### Added
- BBS Directory (toolbar button, Tools > BBS Directory or the command palette): a dialling directory of BBS systems, kept apart from your saved sessions, like the one in SyncTERM.
  - **Update lists** downloads the Synchronet BBS List and the Telnet BBS Guide. Nothing is downloaded until you press it, and a list that has not changed is not downloaded again. The downloaded lists are kept in the settings folder.
  - The Synchronet BBS List comes from the Kalgoorlie Retro BBS, which receives it from Synchronet's list network and exports it with Telnet addresses first, refreshed daily. (The copy at syncterm.bbsdev.net gives SSH first, which only works if you already have an account.)
  - BBSes you have called are listed first under **Recent**, newest first, with the Kalgoorlie Retro BBS always at the top. Then come your own BBSes and one group per list. Search by name, address or description.
  - **Connect** (or double-click) opens the BBS in a new tab with the BBS settings (CP437, ANSI-BBS, VGA font, 80×25, BBS keys). For a BBS listed only for SSH without a user name, Saltbush asks: Telnet (the BBS's own login and new-user screen, port 23 by default) or SSH with your user name there. The choice is remembered.
  - **Save as session** adds the BBS to the top level of the Session Manager.
  - **Add…** adds your own BBS; **Edit…** changes it. A listed BBS is copied to your own BBSes to edit it (**Copy and edit…**), because the next update would undo an edit.
  - Updating a list adds, changes and removes the BBSes that came from it, but never changes a BBS you have called: if the list gives it a new address, **Use new address** appears. Your own BBSes are never touched. A BBS already listed at the same address is not listed twice.
  - **Lists…** changes the list addresses or adds other lists in the SyncTERM format.
  - The directory file (bbs-directory.json) has the same format as Lantern Terminal's 0.6.0.
- Script requests `bbsdir.open`, `bbsdir.state`, `bbsdir.update`, `bbsdir.add`, `bbsdir.connect`, `bbsdir.save`, `bbsdir.remove` and `bbsdir.accept` (the same as Lantern Terminal's).

## 1.8.2 (2026-11-10)

### Added
- Copy Public Key to Server (Tools menu, right-click an SSH session, or the key generator's Copy to Server button): like `ssh-copy-id`, it logs in once (with your password if needed), creates `~/.ssh` and `authorized_keys` if they are missing, sets the permissions SSH requires (700 and 600), adds the key unless it is already there, then checks that the key logs in on its own. It also points out a misspelt `authorised_keys` file on the server, which SSH ignores.

### Changed
- Windows inside Saltbush (SFTP browsers, dialogs) have a darker edge and a shadow, so overlapping windows are easy to tell apart. In the SFTP browser, this computer's files and the server's files are each in their own outlined box, and each new browser opens a little lower and to the right instead of exactly on top of the last one.

## 1.8.1 (2026-11-10)

### Fixed
- Tear-off tabs on Windows with several monitors: a tab dragged out of the tab bar could open its window off the screen (it looked minimised, and only Maximise brought it back), and dragging a window back onto the tab bar often did not dock it. Window positions are now worked out in screen pixels, so monitors with different scaling no longer confuse them, and a new window is moved to exactly where the tab was dropped.

**Tried on real computers:** tear-off tabs and RDP sessions (new in 1.8.0) have been tried on a Linux desktop and on Windows with several monitors, including two RDP sessions at once. The system RDP program option (FreeRDP or mstsc) has not been tried.

## 1.8.0 (2026-11-10)

**Not yet tested on a real computer:** tear-off tabs and RDP sessions are new in 1.8.0 and have only been tested with automated tests and on a virtual X display (Xvfb), not yet on a real Windows or Linux computer.

### Added
- Tear-off tabs: drag a tab down out of the tab bar to open it in its own window, where the session keeps running. Dock it back with "Dock to Main Window", by closing the window, or (X11 and Windows) by dragging the window's "Drag to the tab bar" handle onto the main tab bar. Also: right-click a tab > Move to New Window, Window > Move Tab to New Window / Dock All Tabs to Main Window, and the command palette. Several tabs can be in their own windows; keys and shortcuts act on the window you are typing in.
- RDP sessions (Windows Remote Desktop) as a built-in session type in a normal tab, using IronRDP: TLS with Network Level Authentication (NTLM), the remote desktop fitted to the tab (it resizes with the tab) or a fixed size, keyboard and mouse, text clipboard both ways, Ctrl+Alt+Del, Windows key and Full screen buttons (Ctrl+Alt+End also sends Ctrl+Alt+Del). The server certificate is checked like an SSH host key: shown and asked about the first time, remembered in known_rdp_certificates, and a changed certificate is refused. Passwords come from a credential or are asked in the tab and never saved. Optionally use the system RDP program instead (FreeRDP on Linux, mstsc on Windows); the password is never put on a command line. New Session wizard, Quick Connect and a Session Options "RDP" page support it.

### Changed
- Terminal-only actions (Find, logging, file transfers, Send Break, scripting send) say they are not available on RDP tabs, and their buttons are greyed out there.
- The program is about 7 MB larger because of the RDP code.

## 1.7.0 (2026-11-10)

### Added
- Function keys: F1 Help (keyboard shortcuts), F2 Session Options, F3 / Shift+F3 Find next / previous, F4 Quick Connect, F5 Reconnect, F6 next split pane, F7 SFTP Browser, F8 send a file (Zmodem upload), F9 start/stop logging, F11 full screen, F12 Script > Run, Shift+F12 cancel the script, Ctrl+F12 run the last script again. F10 stays with the remote program. Alt+F1 to Alt+F12 send the plain function key to the remote program, and the session option "Function keys go to the remote program" (Session Options > Input) gives them all back to it. Your own key mappings win over these keys. Menus, the Keyboard Shortcuts window and the command palette show them; Edit > Find Previous and Script > Run Last Script Again are new.
- Script > Run remembers the last script, its arguments and its folder, also after a restart.
- After an update, Restart Now brings the window back with the same size, position (not on Wayland), maximised, minimised or full-screen state. The window size and maximised state are also remembered between normal starts.
- Highlighting and Key Mappings are edited in tables: add, remove and reorder rows, a colour picker, a Regex box, a "press a key" button and an action list, with errors shown per row. Stored settings are unchanged.
- Sync between computers: Options > Global Options > Sync keeps sessions and their folders, credential user names (never passwords), button bars and the default session the same on every computer through a shared folder (Nextcloud, Syncthing, Dropbox or a network share). Settings that belong to one computer, such as local shells, serial ports, key files and log folders, stay as they are on each computer.
- SSH: jump hosts (one or a chain, `user@host:port,user2@host2`) in the built-in engine, each hop with its own host-key check and login; the SFTP browser works through jump hosts too. About 40 OpenSSH `-o` options are now handled by the built-in engine (ServerAliveInterval/CountMax, ConnectTimeout, Ciphers, KexAlgorithms, HostKeyAlgorithms, MACs, PubkeyAcceptedAlgorithms, Compression, StrictHostKeyChecking, UserKnownHostsFile, IdentitiesOnly, IdentityFile, CertificateFile, Port, User, HostName, ProxyJump, ProxyCommand, ForwardAgent, ForwardX11, the forwards and the authentication switches); others still use the OpenSSH client, which the terminal names. Ed25519 OpenSSH certificates now work in the built-in engine.
- SSH: "Use FIPS-approved algorithms only" (Session Options > SSH2) limits key exchange, ciphers, MACs and key types to FIPS-approved ones (and RSA keys to 2048 bits or more), refuses Ed25519 keys with a clear message, and shows whether OpenSSL's FIPS provider is active. It limits algorithms; Saltbush is not a FIPS 140 validated module.
- Terminal emulation: double-width and double-height lines, left/right margins (DECLRMM/DECSLRM), real 132-column mode (the screen becomes 132 columns and the font shrinks to fit), selective erase (DECSCA, DECSED, DECSEL), 8-bit C1 controls in ISO 8859 sessions (not in CP437 or other code pages) and C1 code points in UTF-8, and sixel graphics (images scroll with the text; the device-attributes reply now announces sixel for xterm types).
- macOS: the code now has macOS support (settings in ~/Library/Application Support/saltbush, passwords in the Keychain, /dev/cu.* serial ports, zsh login shell) and `scripts/build-macos.sh` builds a .app, .zip and .dmg on a Mac with Homebrew. It has not yet been built or run on a Mac.

### Changed
- The Activity, Options and other labels use ">" between menu names, and the Button Bars dialog uses Up and Remove buttons, because the interface font has no arrow characters.
- Keepalives with ServerAliveCountMax close a session whose server stops answering.
- A host key of a different type than the one in known_hosts now gets the normal "new host" question with a note, instead of being refused as a changed key. A changed key of the same type is still refused.

### Fixed
- Password and keyboard-interactive SSH logins, remote and SOCKS forwards are now covered by automated tests.

## 1.6.1 (2026-11-10)

### Fixed
- Scripts ran slowly, especially SyncTERM-Lua bots such as lordbot.lua, and almost stopped while the window was minimised or hidden. Every script request waited for the window to draw its next frame (at most once per screen refresh, and not at all when the window is not shown). Requests are now answered by a background thread, and waits for text return as soon as text arrives instead of checking every 25–30 ms. A full-screen read (as lordbot.lua does after each move) went from about 0.37 s to under 0.02 s on a test display, and more on a real screen.
- Text in the Activity pane could not be copied while a script was writing to it: each new line cleared the selection and Ctrl+C went to the terminal. The pane is now one selectable text: the selection stays as lines arrive, Ctrl+C copies it after you click or drag in the pane, and right-click offers Copy and Copy All. A Copy All button was added.

## 1.6.0 (2026-11-10)

### Added
- SFTP browser: two panes, this computer on the left and the server on the right. **Upload >>** and **<< Download** copy the selected files and folders across, and double-clicking a file copies it to the other side. New Folder, Rename and Delete work on both sides (deleting on this computer asks first and is permanent). Shift+click selects a range.
- Interrupted transfers resume. An unfinished download is kept as `name.part` on this computer and an unfinished upload as `name.part` on the server; sending the same file again continues where it stopped, as long as the original has not changed since.
- Permissions…: tick read, write and run for owner, group and others on the selected server files and folders.
- Transfers keep the file's modification time. Uploads from Linux keep the file's permissions (for example, scripts stay runnable).

### Changed
- The local pane replaces the Upload Files… and Upload Folder… buttons and the Download folder chooser. Downloads go to the folder shown on the left, which starts at the session's download folder. Dropping files on the window still uploads them.

## 1.5.0 (2026-11-10)

### Added
- Update notifications: Saltbush checks the website once a day (https://retro.theiguru.au/saltbush/latest.json) and says when a new version is out, with Update Now, Not Now and Skip This Version. Update Now installs the new .deb (asks for your password through pkexec) or runs the new Windows installer; other copies open the download page. Help → Check for Updates checks at any time. Turn the notices off in Options → Global Options or in the update window (on by default).

### Fixed
- Pasting on Wayland (KDE Plasma and others): Edit → Paste, the right-click menu, the toolbar button, Shift+Insert, middle-click and script clipboard reads now read the Wayland clipboard. They used to read the X11 clipboard, which KDE keeps empty for Wayland windows, so only Ctrl+Shift+V worked.

## 1.4.0 (2026-11-09)

### Added
- SSH: the built-in engine now does X11 forwarding (fake cookie swapped locally; untrusted mode uses an xauth untrusted cookie like `ssh -X`), agent forwarding (Linux), OpenSSH certificate logins (RSA and ECDSA), Kerberos (GSSAPI) logins with optional credential delegation, and compression. These no longer need the OpenSSH client.
- Tools → SSH Agent: list the agent's keys, add key files (passphrase, lifetime, confirm-on-use), add or remove smartcard/token keys through PKCS#11, remove one or all keys, lock and unlock, and start an agent for Saltbush's sessions (stopped when Saltbush exits).
- SFTP browser: Transfer → SFTP Browser or right-click an SSH session. Browse folders, upload files and folders (or drop them on the window), download, new folder, rename, delete, progress and Cancel. Login questions appear in the window.
- Built-in Xmodem (checksum, CRC, 1K), Ymodem batch and Kermit (long packets, CRC, 8th-bit prefixing, repeat counts) uploads and downloads, on Linux and Windows. Kermit downloads start by themselves. The lrzsz programs are no longer needed.
- Terminal emulation: DEC Special Graphics and G0–G3 character sets, tab stops (HTS, TBC, CHT, CBT), IND/NEL, DECALN, REP, CNL/CPL, HPA/HPR/VPR/HVP, insert and newline modes, auto-wrap control (the "Wrap long terminal lines" option now works), reverse-video screen, alternate screen 1047/1048, DECSTR soft reset, ED 3, cursor shapes set by programs (DECSCUSR), dim, hidden and strikethrough text, VT220 and xterm device-attribute replies and mode reports (DECRQM). IL/DL respect the scroll region.
- New terminal types Wyse 60 and SCO ANSI, with their own keys; VT220 sessions send VT220 function and editing keys.
- Split panes: View → Split Left/Right (Ctrl+Shift+E) and Split Top/Bottom (Ctrl+Shift+O) show several sessions at once. Click a pane to give it the keyboard; drag the divider to resize. A tab chosen in the tab bar shows in the active pane, or its pane becomes active if it is already on screen. View → Close Pane and Single Pane undo the split. Each pane's terminal gets its own size.
- Linux: the Debian package now includes AppStream information, so Saltbush Terminal shows up in Discover and other software centres after it is installed.

### Changed
- X/Ymodem use the built-in engines instead of lrzsz; the package no longer recommends lrzsz.

## 1.3.1 (2026-11-09)

### Fixed
- Lua `regex.find`, `regex.match`, `expect_regex` and `on(..., 'regex')` now accept PCRE features (lookahead, lookbehind, back-references, inline flags) as SyncTERM-Lua does. lordbot.lua and twbot.lua stopped with a "bad regex" error.

## 1.3.0 (2026-11-09)

### Added
- Windows version: installer (per user, Start menu shortcut, uninstaller) and a portable zip. Built-in SSH, scripting (Python and Lua), Telnet, RLogin, serial (COM ports), local shells (PowerShell or cmd) and Zmodem work on Windows; credential passwords use Windows Credential Manager.
- Built-in Zmodem (ported from Lantern Terminal's engine), used on Linux and Windows. Downloads still start by themselves; uploads start when the host is ready to receive.
- A program icon of its own (taskbar, window list, menus, the Windows exe and installer).

### Changed
- Each tab now has its close button inside it (middle-click also closes a tab).

### Fixed
- Lua scripts did not have the standard `debug` library (SyncTERM-Lua and Lantern scripts may use it).
- High CPU use: the built-in SSH engine busy-waited for data, and the window redrew itself continuously. An idle window now uses almost no CPU.
- Scripts could connect to the session's port instead of the application when a session had a port number set (the variable names clashed).

## 1.2.2 (2026-11-09)

### Changed
- Colours in Session Options are chosen in their own picker window (with a hex field and a Close button) instead of a pop-up. Closing it leaves Session Options open, so text, background and cursor colours can be set one after another. The cursor colour uses the same picker.

## 1.2.1 (2026-11-09)

### Fixed
- Every Browse… button and file dialog (private key, log file, scripts, transfers, import, export) crashed the program: the file-dialog library was built to need a runtime the program does not start. It now uses its own.

## 1.2.0 (2026-11-09)

### Changed
- The program is now called Saltbush Terminal (command `saltbush`). Settings from SecureTerm (`~/.config/secureterm`) are copied over the first time it starts.

### Added
- A built-in SSH engine (libssh), the default for SSH2 sessions: host-key checks and prompts in the terminal, agent, key, keyboard-interactive and password logins, remote commands, local/remote/SOCKS forwards, keepalive. The OpenSSH client remains available per session and is used automatically for features the engine lacks.
- Scripting with the same interface as Lantern Terminal: Python and built-in Lua 5.4, logon scripts, Script → Run/Cancel, recording, the Activity pane, script dialogs, Zmodem uploads from scripts, and the SyncTERM-Lua compatibility layer. Logon scripts now use this interface instead of standard input/output.

## 1.1.0 (2026-11-09)

### Fixed
- The project did not build: the patched `vt100` crate was missing. It is now in `vendored/vt100` with its changes documented.
- Find never found anything; it now searches the whole history and wraps round.
- Ctrl+C did nothing in the terminal, and Ctrl+W, Ctrl+D and other Ctrl keys were taken by the application. Application shortcuts now use Ctrl+Shift.
- The terminal took keyboard focus from dialogs every frame, so typing in Quick Connect, Find or the key generator could go to the shell.
- Save As could not change the name.
- A crash after about 2 MB of output containing non-ASCII text.
- "localhost" with no user name always opened a local shell, whatever the protocol. Local Shell is now its own protocol.
- Restore Defaults deleted every saved session; it now resets options only, and asks first. Deleting sessions also asks first.
- A settings file that could not be read was replaced by defaults on exit. It is now kept and the problem is reported; saves are atomic.
- The key passphrase was visible on the ssh-keygen command line, and choosing a key location could change the permissions of an existing folder such as the home folder.
- Host names starting with "-" could pass options to the SSH, Telnet and nc clients.
- The Command Window sent to every tab by default.
- A failed "log on connect" left the connection program running; closed sessions left zombie processes.
- Disabled toolbar buttons still worked; several settings had no effect; the profile's scrollback length was ignored beyond 500 lines; drawing copied the whole history every frame.
- Packaging: the README referred to files that did not exist and install.sh had a duplicated branch.

### Added
- Session Options pages for SSH2, Forwarding, Local Shell, Serial, Telnet, RLogin, Logon, Input, Behaviour, Highlighting, Key Mappings, Buttons and File Transfer (see README).
- Built-in Telnet, RLogin, raw TCP and serial connections.
- BBS support: CP437, ANSI-BBS emulation, iCE colours, the VGA font, scaled 80×25, BBS keys, cursor-position replies, Zmodem auto-download.
- New Session and New BBS Session wizards, Import BBS List (SyncTERM), Apply BBS Settings, multi-session editing.
- Credentials with passwords in the desktop password store; button bars; Zmodem/Ymodem/Xmodem transfers; Send Break; Reconnect.
- Character encodings, resize modes, highlighting, key mappings, paced and bracketed paste, OSC 52, answerback, bells, auto-reconnect, anti-idle.
- Log templates, timestamps, prefixes, rotation and connect/disconnect messages.
- A Debian package and a tarball installer with uninstall.
